import { getStore, setStore } from '@/util/store';
import { isURL, validatenull } from '@/util/validate';
import { getUserInfo, loginByMobile, loginBySocial, loginByUsername, logout, refreshToken } from '@/api/login';
import { deepClone, encryption } from '@/util/util';
import webiste from '@/const/website';
import { resetRouter } from '@/router/router';
import { getMenu, getTopMenu } from '@/api/admin/menu';
import { postBind } from '@/api/company-manage/authorization';
function addPath(ele, first) {
	const menu = webiste.menu;
	const propsConfig = menu.props;
	const propsDefault = {
		label: propsConfig.label || 'name',
		path: propsConfig.path || 'path',
		icon: propsConfig.icon || 'icon',
		children: propsConfig.children || 'children',
	};
	const icon = ele[propsDefault.icon];
	ele[propsDefault.icon] = validatenull(icon) ? menu.iconDefault : icon;
	const isChild = ele[propsDefault.children] && ele[propsDefault.children].length !== 0;
	if (!isChild) ele[propsDefault.children] = [];
	if (!isChild && first && !isURL(ele[propsDefault.path])) {
		ele[propsDefault.path] = ele[propsDefault.path] + '/index';
	} else {
		ele[propsDefault.children].forEach((child) => {
			addPath(child);
		});
	}
}

const user = {
	state: {
		marketingAuthCode:
			getStore({
				name: 'marketingAuthCode',
			}) || {},
		userInfo: {},
		permissions: {},
		roles: [],
		roleCodes: [],
		menu:
			getStore({
				name: 'menu',
			}) || [],
		menuAll: [],
		expires_in:
			getStore({
				name: 'expires_in',
			}) || '',
		access_token:
			getStore({
				name: 'access_token',
			}) || '',
		refresh_token:
			getStore({
				name: 'refresh_token',
			}) || '',
		corps: [],
	},
	actions: {
		// 根据用户名登录
		LoginByUsername({ commit }, userInfo) {
			const user = encryption({
				data: userInfo,
				key: 'madpmadpmadpmadp',
				param: ['password'],
			});
			return new Promise((resolve, reject) => {
				loginByUsername(user.username, user.password, user.code, user.randomStr)
					.then((response) => {
						const data = response.data;
						commit('SET_ACCESS_TOKEN', data.access_token);
						commit('SET_REFRESH_TOKEN', data.refresh_token);
						commit('SET_EXPIRES_IN', data.expires_in);
						commit('CLEAR_LOCK');
						resolve(data);
					})
					.catch((error) => {
						reject(error);
					});
			});
		},
		// 根据手机号登录
		LoginByPhone({ commit }, userInfo) {
			return new Promise((resolve, reject) => {
				loginByMobile(userInfo.mobile, userInfo.code)
					.then((response) => {
						const data = response.data;
						commit('SET_ACCESS_TOKEN', data.access_token);
						commit('SET_REFRESH_TOKEN', data.refresh_token);
						commit('SET_EXPIRES_IN', data.expires_in);
						commit('CLEAR_LOCK');
						resolve();
					})
					.catch((error) => {
						reject(error);
					});
			});
		},
		// 根据OpenId登录
		LoginBySocial({ commit }, param) {
			return new Promise((resolve, reject) => {
				loginBySocial(param.state, param.code)
					.then((response) => {
						const data = response.data;
						commit('SET_ACCESS_TOKEN', data.access_token);
						commit('SET_REFRESH_TOKEN', data.refresh_token);
						commit('SET_EXPIRES_IN', data.expires_in);
						commit('CLEAR_LOCK');
						resolve();
					})
					.catch((error) => {
						reject(error);
					});
			});
		},
		GetUserInfo({ commit }) {
			return new Promise((resolve, reject) => {
				getUserInfo()
					.then((res) => {
						const data = res.data.data || {};
						data.sysUser.deptName = data.deptName;
						data.sysUser.roleNames = data.roleNames;
						commit('SET_USER_INFO', data.sysUser);
						commit('SET_ROLES', data.roles || []);
						commit('SET_ROLECODES', data.roleCodes || []);
						commit('SET_PERMISSIONS', data.permissions || []);
						resolve(data);
					})
					.catch(() => {
						reject();
					});
			});
		},
		// 刷新token
		RefreshToken({ commit, state }) {
			return new Promise((resolve, reject) => {
				refreshToken(state.refresh_token)
					.then((response) => {
						const data = response.data;
						commit('SET_ACCESS_TOKEN', data.access_token);
						commit('SET_REFRESH_TOKEN', data.refresh_token);
						commit('SET_EXPIRES_IN', data.expires_in);
						commit('CLEAR_LOCK');
						resolve();
					})
					.catch((error) => {
						reject(error);
					});
			});
		},
		// 登出
		LogOut({ commit }) {
			return new Promise((resolve, reject) => {
				logout()
					.then(() => {
						resetRouter();
						commit('SET_MENU', []);
						commit('SET_PERMISSIONS', []);
						commit('SET_USER_INFO', {});
						commit('SET_ACCESS_TOKEN', '');
						commit('SET_REFRESH_TOKEN', '');
						commit('SET_EXPIRES_IN', '');
						commit('SET_ROLES', []);
						commit('SET_ROLECODES', []);
						commit('DEL_ALL_TAG');
						commit('CLEAR_LOCK');
						resolve();
					})
					.catch((error) => {
						reject(error);
					});
			});
		},
		// 注销session
		FedLogOut({ commit }) {
			return new Promise((resolve) => {
				resetRouter();
				commit('SET_MENU', []);
				commit('SET_PERMISSIONS', []);
				commit('SET_USER_INFO', {});
				commit('SET_ACCESS_TOKEN', '');
				commit('SET_REFRESH_TOKEN', '');
				commit('SET_ROLES', []);
				commit('SET_ROLECODES', []);
				commit('DEL_ALL_TAG');
				commit('CLEAR_LOCK');
				resolve();
			});
		},
		// 获取系统菜单
		GetMenu({ commit }, obj) {
			return new Promise((resolve) => {
				getMenu(obj.id).then((res) => {
					const data = res.data.data;
					const menu = deepClone(data);
					menu.forEach((ele) => {
						addPath(ele);
					});
					let type = obj.type;
					commit('SET_MENU', { type, menu });
					resolve(menu);
				});
			});
		},
		//顶部菜单
		GetTopMenu() {
			return new Promise((resolve) => {
				getTopMenu().then((res) => {
					const data = res.data.data || [];
					resolve(data);
				});
			});
		},
		//登录用户绑定企业信息
		BindCorp({ commit }, id) {
			return new Promise((resolve, reject) => {
				postBind(id)
					.then((res) => {
						let data = res.data.data;
						console.log('SET_CORPS', data.corps);
						commit('SET_CORPS', data.corps);
						resolve(res);
					})
					.catch((error) => {
						reject(error);
					});
			});
		},
	},
	mutations: {
		SET_MARKETING_AUTHCODE: (state, marketingAuthCode) => {
			state.marketingAuthCode = marketingAuthCode;
			setStore({
				name: 'marketingAuthCode',
				content: state.marketingAuthCode,
				type: 'session',
			});
		},
		SET_ACCESS_TOKEN: (state, access_token) => {
			state.access_token = access_token;
			setStore({
				name: 'access_token',
				content: state.access_token,
				type: 'session',
			});
		},
		SET_EXPIRES_IN: (state, expires_in) => {
			state.expires_in = expires_in;
			setStore({
				name: 'expires_in',
				content: state.expires_in,
				type: 'session',
			});
		},
		SET_REFRESH_TOKEN: (state, rfToken) => {
			state.refresh_token = rfToken;
			setStore({
				name: 'refresh_token',
				content: state.refresh_token,
				type: 'session',
			});
		},
		SET_USER_INFO: (state, userInfo) => {
			state.userInfo = userInfo;
			setStore({
				name: 'tenantId',
				content: state.userInfo.tenantId,
			});
		},
		SET_MENU: (state, params = {}) => {
			let { menu, type } = params;
			if (type !== false) state.menu = menu;
			setStore({
				name: 'menu',
				content: menu,
				type: 'session',
			});
		},
		SET_MENU_ALL: (state, menuAll) => {
			state.menuAll = menuAll;
		},
		SET_ROLES: (state, roles) => {
			state.roles = roles;
		},
		SET_ROLECODES: (state, roleCodes) => {
			state.roleCodes = roleCodes;
		},
		SET_PERMISSIONS: (state, permissions) => {
			const list = {};
			for (let i = 0; i < permissions.length; i++) {
				list[permissions[i]] = true;
			}
			state.permissions = list;
		},
		SET_CORPS: (state, data) => {
			state.corps = data;
			setStore({
				name: 'corps',
				content: data ? data[0] : '',
			});
			setStore({
				name: 'corpsList',
				content: data,
			});
		},
	},
};
export default user;
